title: “Estrutura dos Resultados” output: html_document date: “2023-05-20” —

source(here::here("R/minhas_funcoes.R"))

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Carregando pacotes exigidos: ggplot2
here() starts at /home/usuario/Documentos/Vitor/Piper3D/WWF/Monitora/Dados/Monitora/Monitora/piper3d_monitora_florestal

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union


Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

Fluxo de análise dos dados:

A seguir, apresentamos o fluxo de análise dos dados que envolve a fase exploratória, truncamento, ajuste e avaliação de modelos e estimativas de abundância e densidade para as espécies que selecionamos como modelo. Usamos como critérios de seleção tanto o número de ocorrências por Unidade de Conservação quanto a distribuição das frequências de observação, nos casos em que isso foi possível. De forma geral, as espécies com número satisfatório de ocorrências (>60), apresentaram pico de observações próximos a zero.

Para todas as espécies modelo, nós implementamos duas estratégias para lidar com os efeitos indesejados nos dados: pico próximo a zero (heaping near zero) e número excessivo de repetições amostrais na mesma trilha. Para lidar com os picos, testamos o uso dos dados com distâncias exatas e distâncias agrupadas. Para lidar com as repetições, testamos a análise dos dados com todas as repetições e com o número de repetições reduzidas.

Especies com maior numero de ocorrencias/UC possibilitam testar, posteriormente, estratificações nos dados, preservando um número de ocorrências satisfatório dentro dos estratos. Por isso começamos apresentando um fluxo completo de análise, incluindo Amostragem por Distância Convencional, Amostragem por Distância com Múltiplas Covariáveis e Amostragem por Distância com Estratificação nos dados com as espécies com maior número de ocorrência.

PRIMEIRO MODELO - Dasyprocta croconota - Resex Tapajós Arapiuns

Fonte: biolib.cz

Essa é a espécie com o mair número de ocorrências para uma mesma UC. Apresentou, como a maioria das espécies em diferentes UCs, um pico de ocorrências próximo a zero.

Carregar Dados

Para selecionar do conjunto de dados da espécie e a Unidade de conservação de interesse, usar a função transforma_para_distanceR_com_repeticao_filtra_uc_sp(), especificando o nome da Unidade de conservação através do argumento nome_uc e o nome da espécie através do argumento nome_sp.

# carregar dados
cutia_tap_arap <- transforma_para_distanceR_com_repeticao_filtra_uc_sp(
  nome_uc = "Resex Tapajos-Arapiuns",
  nome_sp = "Dasyprocta croconota"
) 

cutia_tap_arap

Amostragem por Distância Convencional

Fluxo 1 - Distâncias exatas com todas as repetições

Plotando o histograma das frequências de ocorrência pela distância

O histograma interativo está disponível no app em Shiny app_distancia_interativo.R. A distribuição dos dados no histograma permite observar um pico de observações próximo a zero, além de uma considerável perda em detectabilidade a partir dos 20m. Vamos testar diferentes proporções de truncamento.

cutia_tap_arap |> 
  drop_na(distance) |> 
plotar_distribuicao_distancia_interativo(largura_caixa = 1)
Warning: Continuous y aesthetic
ℹ did you forget `aes(group = ...)`?
Testando distância de truncamento (w)

Vamos explorar diferentes distâncias de truncamento para um mesmo modelo de distribuição half-normal. Optamos por truncar os dados pela percentagem para padronizar a rotina para diferentes espécies. Buckland et al. (2001) sugere um corte entre 5-10% das observações detectadas nas maiores distãncias. Vamos selecionar o valor de corte pelo modelo com melhor ajuste.

Tabela com resumo comparativo dos modelos
# conduz a selecao da melhor distancia de truncamento a partir do ajsute de modelos com funcao de deteccao half-normal sem termos de ajuste
cutia_tap_arap_dist_trunc <- cutia_tap_arap |> 
  selecionar_distancia_truncamento()
Fitting half-normal key function
AIC= 4676.418
Fitting half-normal key function
AIC= 5354.545
Fitting half-normal key function
AIC= 5791.182
Fitting half-normal key function
AIC= 6375.771
Fitting half-normal key function
AIC= 7212.428
cutia_tap_arap_dist_trunc$selecao
Plotando o histograma com os dados truncados.

Histogramas resultantes dos modelos, com todas as distâncias de truncagem, para auxiliar na seleção da melhor distãncia.

plotar_funcao_deteccao_selecao_distancia_truncamento(cutia_tap_arap_dist_trunc)

$`25%`
NULL

$`20%`
NULL

$`15%`
NULL

$`10%`
NULL

$`5%`
NULL

Ajustando diferentes modelos de funções de deteção
Uniforme com termos de ajuste Cosseno e polinomial simples
# ajustando a função de detecção uniforme para um truncamento de 25% dos dados
cutia_tap_arap_unif <- cutia_tap_arap |> 
  ajuste_modelos_distance_unif(truncamento = "10%")
Starting AIC adjustment term selection.
Fitting uniform key function
AIC= 6586.595
Fitting uniform key function with cosine(1) adjustments
AIC= 6363.157
Fitting uniform key function with cosine(1,2) adjustments
AIC= 6357.69
Fitting uniform key function with cosine(1,2,3) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6328.133
Fitting uniform key function with cosine(1,2,3,4) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6295.384
Fitting uniform key function with cosine(1,2,3,4,5) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6288.133
Warning: Detection function is not strictly monotonic!Starting AIC adjustment term selection.
Fitting uniform key function
AIC= 6586.595
Fitting uniform key function with simple polynomial(2) adjustments
AIC= 6410.42
Fitting uniform key function with simple polynomial(2,4) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6367.003
Fitting uniform key function with simple polynomial(2,4,6) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6363.953
Fitting uniform key function with simple polynomial(2,4,6,8) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6364.18

Uniform key function with simple polynomial(2,4,6) adjustments selected.
Warning: Detection function is not strictly monotonic!
Half-Normal sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção half-normal para um truncamento de 25% dos dados
cutia_tap_arap_hn <- cutia_tap_arap |> 
  ajuste_modelos_distance_hn(truncamento = "10%")
Fitting half-normal key function
AIC= 6375.771
Starting AIC adjustment term selection.
Fitting half-normal key function
AIC= 6375.771
Fitting half-normal key function with cosine(2) adjustments
AIC= 6349.7
Fitting half-normal key function with cosine(2,3) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6321.849
Fitting half-normal key function with cosine(2,3,4) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6293.72
Fitting half-normal key function with cosine(2,3,4,5) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6282.534
Fitting half-normal key function with cosine(2,3,4,5,6) adjustments
Warning: Detection function is not strictly monotonic!AIC= 6220.852
Warning: Detection function is not strictly monotonic!Starting AIC adjustment term selection.
Fitting half-normal key function
AIC= 6375.771
Fitting half-normal key function with Hermite(4) adjustments
AIC= 6377.362

Half-normal key function selected.
Hazard-rate sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção hazard-rate para um truncamento de 25% dos dados
cutia_tap_arap_hr <- cutia_tap_arap |> 
  ajuste_modelos_distance_hr(truncamento = "10%")
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 6048.452
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Starting AIC adjustment term selection.
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 6048.452
Fitting hazard-rate key function with cosine(2) adjustments
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Warning: Model fitting did not converge. Try different initial values or different model
  Model failed to converge.

Hazard-rate key function selected.
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Starting AIC adjustment term selection.
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 6048.452
Fitting hazard-rate key function with simple polynomial(4) adjustments
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Warning: Model fitting did not converge. Try different initial values or different model
  Model failed to converge.

Hazard-rate key function selected.
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).
Comparando os modelos
Tabela com o resumo comparativo dos modelos
lista_modelos_ajustados <- list(
  `half-normal` = cutia_tap_arap_hn, 
  `hazard-rate` = cutia_tap_arap_hr, 
  uniforme = cutia_tap_arap_unif
)

selecao_funcao_deteccao_termo_ajsute <- selecionar_funcao_deteccao_termo_ajuste(lista_modelos_ajustados)

selecao_funcao_deteccao_termo_ajsute
Gráficos de ajuste das funções de deteção às probabilidades de deteção

Sugestão: adicionar título ao gráficos gerar graficos usando ggplot2

# gerar uma lista com os modelos selecionados ordenados do melhor para o pior modelo
modelos_selecionados <- list(
  cutia_tap_arap_hr$`Sem termo`,
  cutia_tap_arap_hn$Cosseno,
  cutia_tap_arap_unif$Cosseno,
  cutia_tap_arap_unif$`Polinomial simples`,
  cutia_tap_arap_hn$`Sem termo`
)

# atribuir o nome dos modelos aos itens da lista
names(modelos_selecionados) <- selecao_funcao_deteccao_termo_ajsute$Model

# plotar a probabilidade de detecção observada (barras) e a esperada (linhas e pontos)
plotar_funcao_deteccao_modelos_selecionados(modelos_selecionados)

$`Hazard-rate`
NULL

$`Half-normal with cosine adjustment terms of order 2,3,4,5,6`
NULL

$`Uniform with cosine adjustment terms of order 1,2,3,4,5`
NULL

$`Uniform with simple polynomial adjustment terms of order 2,4,6`
NULL

$`Half-normal`
NULL

Teste de bondade de ajuste dos modelos e Q-Q plots
bondade_ajuste_fluxo1 <- testar_bondade_ajuste(modelos_selecionados, plot = TRUE)

bondade_ajuste_fluxo1
Avaliando as estimativas de Abundância e Densidade

Sugestão de aperfeiçoamento das funções: gerar uma única tabela a partir de um funções join e rbind() das tabelas geradas por cada função, adicionando uma coluna que identifica cada um dos modelos.

Características da área de estudo e da taxa de encontro
# gera lista contendo os modelos selecionados para cada função de detecção e termo de ajuste
lista_modelos_ajustados_termos <- list(
  cutia_tap_arap_hr$`Sem termo`,
  cutia_tap_arap_hn$Cosseno,
  cutia_tap_arap_unif$Cosseno,
  cutia_tap_arap_unif$`Polinomial simples`,
  cutia_tap_arap_hn$`Sem termo`
)

# área de estudo, tamanho da área de estudo, area coberta pelo esforço amostral, esforço amostral em metros, número de detecções, número de transectos (ea), taxa de encontro, coeficiente de variação da taxa de encontro  
caracteristicas_area_estudo_taxa_encontro <- lista_modelos_ajustados_termos |> 
  gerar_caracteristicas_area_estudo_taxa_encontro(resultado_selecao_modelos = selecao_funcao_deteccao_termo_ajsute)

caracteristicas_area_estudo_taxa_encontro
Características de abundância, esforço e detecção
# área de estudo, tamanho da área de estudo, trilhas ou estações amostrais, esforço total em cada trilha, abundância estimada em cada estação amostral, número de detecções em cada estação amostral, área total amostrada
caracteristicas_esforco_abundancia_deteccao <- lista_modelos_ajustados_termos |> 
  gerar_caracteristicas_esforco_abundancia_deteccao(resultado_selecao_modelos = selecao_funcao_deteccao_termo_ajsute)

caracteristicas_esforco_abundancia_deteccao
Características de densidade
# total, densidade estimada, erro padrão da densidade destimada, coeficiente de variação da densidade destimada, intervalo de confiança inferior e superior do coeficiente de variação, gruas de liberdade
caracteristicas_densidade <- lista_modelos_ajustados_termos |> 
  gerar_caracteristicas_densidade(resultado_selecao_modelos = selecao_funcao_deteccao_termo_ajsute)

caracteristicas_densidade

Fluxo 2 - Distâncias exatas com repetições reduzidas

Filtrando os dados para reduzir as repetições
dados_selecionados <- carregar_dados_selecionados()
cutia_tap_arap_quase_sem_repeticao <- transforma_para_dsitanceR_quase_sem_repeticao_filtra_uc_sp(
  dados = dados_selecionados,
  nome_uc = "Resex Tapajos-Arapiuns",
  nome_sp = "Dasyprocta croconota"
)

cutia_tap_arap_quase_sem_repeticao
Plotando o histograma das frequências de ocorrência pela distância

O histograma interativo está disponível no app em Shiny app_distancia_interativo.R. A distribuição dos dados no histograma permite observar um pico de observações próximo a zero, além de uma considerável perda em detectabilidade a partir dos 20m. Vamos testar diferentes proporções de truncamento.

cutia_tap_arap_quase_sem_repeticao |> 
  drop_na(distance) |> 
plotar_distribuicao_distancia_interativo(largura_caixa = 1)
Warning: Continuous y aesthetic
ℹ did you forget `aes(group = ...)`?
Testando distância de truncamento (w)

Vamos explorar diferentes distâncias de truncamento para um mesmo modelo de distribuição half-normal. Optamos por truncar os dados pela percentagem para padronizar a rotina para diferentes espécies. Buckland et al. (2001) sugere um corte entre 5-10% das observações detectadas nas maiores distãncias. Vamos selecionar o valor de corte pelo modelo com melhor ajuste.

Tabela com resumo comparativo dos modelos
Plotando o histograma com os dados truncados.

plotar_funcao_deteccao_selecao_distancia_truncamento(cutia_tap_arap_quase_sem_repeticao_dist_trunc)
$`25%`
NULL

$`20%`
NULL

$`15%`
NULL

$`10%`
NULL

$`5%`
NULL

Ajustando diferentes modelos de funções de deteção
Uniforme + Cosseno
Half-Normal sem termos de ajuste e com termos de ajuste
Hazard-rate sem termos de ajuste e com termos de ajuste
Comparando os modelos
Tabela com o resumo comparativo dos modelos
Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Fluxo 3 - Distâncias agrupadas com todas as repetições

Plotando o histograma das frequências de ocorrência pela distância

O histograma interativo está disponível no app em Shiny app_distancia_interativo.R. A distribuição dos dados no histograma permite observar um pico de observações próximo a zero, além de uma considerável perda em detectabilidade a partir dos 20m. Vamos testar diferentes proporções de truncamento.

Testando distância de truncamento (w)

Vamos explorar diferentes distâncias de truncamento para um mesmo modelo de distribuição half-normal. Optamos por truncar os dados pela percentagem para padronizar a rotina para diferentes espécies. Buckland et al. (2001) sugere um corte entre 5-10% das observações detectadas nas maiores distãncias. Vamos selecionar o valor de corte pelo modelo com melhor ajuste.

Tabela com resumo comparativo dos modelos
Plotando o histograma com os dados truncados.
Ajustando diferentes modelos de funções de deteção
Uniforme + Cosseno
Half-Normal sem termos de ajuste e com termos de ajuste
Hazard-rate sem termos de ajuste e com termos de ajuste
Comparando os modelos
Tabela com o resumo comparativo dos modelos
Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Fluxo 4 - Distâncias agrupadas com repetições reduzidas

Plotando o histograma das frequências de ocorrência pela distância

O histograma interativo está disponível no app em Shiny app_distancia_interativo.R. A distribuição dos dados no histograma permite observar um pico de observações próximo a zero, além de uma considerável perda em detectabilidade a partir dos 20m. Vamos testar diferentes proporções de truncamento.

Testando distância de truncamento (w)

Vamos explorar diferentes distâncias de truncamento para um mesmo modelo de distribuição half-normal. Optamos por truncar os dados pela percentagem para padronizar a rotina para diferentes espécies. Buckland et al. (2001) sugere um corte entre 5-10% das observações detectadas nas maiores distãncias. Vamos selecionar o valor de corte pelo modelo com melhor ajuste.

Tabela com resumo comparativo dos modelos
Plotando o histograma com os dados truncados.
Ajustando diferentes modelos de funções de deteção
Uniforme + Cosseno
Half-Normal sem termos de ajuste e com termos de ajuste
Hazard-rate sem termos de ajuste e com termos de ajuste
Comparando os modelos
Tabela com o resumo comparativo dos modelos
Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Amostragem por Distância com Múltiplas Covariáveis

Após testar as quatro estratégias anteriores para lidar com efeitos indesejados nos dados, escolhemos a estratégia com melhores resultados, considerando a bondade de ajuste dos modelos e os coeficientes de variação das estimativas de abundância e densidade, para adicionar covariávies. Consideramos, com base nos dados do Programa Monitora, duas covariáveis. A primeira dela, tamanho do grupo. De forma geral, pode existir uma tendência a um viés no tamanho do grupo com a distância, com a perda de detectabilidade para grupos menores. Além disso, o tamanho do grupo também é utilizado para corrigir as estimativas de abudância e densidade. A outra covariável criamos a partir dos dados de horário de início e horário de registro das espécies, calculando os minutos após o início da amostragem. Muitas espécies variam sua atividade ao longo do dia, e podem ser mais ou menos detectáveis de acordo com o horário.

Explorando covariáveis

Gráficos exploratórios
Distância x Tamanho do grupo
Distância x Minutos após o início da amostragem
Ajustando diferentes modelos com covariáveis

Para o uso de coveriáveis, podemos usar somente as distribuições half-normal ou hazard-rate, pois ambas possuem o parâmetro escalar pelo qual o vetor das covariáveis será multiplicado. Não é recomendável o uso de termos de ajuste com o uso de covariáveis pela grande chance de perda de monotonicidade nas curvas das funções de detecção. Assim, vamos trabalhar com as seguintes combinações de modelos

Half-normal sem termos de ajuste (HN)
HN + Tamanho do grupo (HN + S)
HN + Minutos após o início da amostragem (HN + M)
HN + Tamanho do grupo + Minutos após início da amostragem (HN + S + M)
Hazard-rate sem termos de ajuste (HZ)
HZ + Tamanho do grupo (HZ + S)
HZ + Minutos após o início da amostragem (HZ + M)
HZ + Tamanho do grupo + Minutos após início da amostragem (HZ + S + M)
Comparando os modelos
Tabela com o resumo comparativo dos modelos
Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Para o uso de covariáveis, as estimativas de abundância/densidade devem ser feitas através do bootstrap.

Amostragem por Distância com Estratificação

O uso da estratificação, no caso dos dados do progama monitora, pode ser usado a partir de duas abordagens. A primeira delas seria focada na dinâmica populacional, para estimar abundâncias e densidades em períodos amostrais diferentes e acompanhar o tamanho da população ao longo do tempo. Para essa abordagem, estratificar os dados por ano permite que sejam feitas estas estimativas. O pacote Distance para o R é mais limitado que o programa Distance para o Windows em termos de opções de comando para estratificar os dados por amostragem, e entende a estratificação através da variável Region.Label, usada para informar estratificação espacial. Como a nossa intenção é estratificar por ano, vamos inserir os anos como estratos na variável Region.Label, assumindo que se tratam de amostras diferentes, pois nosso interesse está na variação nos dados, independente da fonte de variação ser espacial ou temporal.

Uma outra abordagem possível é usar a estratificação espacial. No caso dos dados do Programa Monitora, a variação entre as UCs para uma mesma espécie parece ser mais relevante que a variação dentro de uma mesma UC, pois entendemos que não há um desenho amostral sistematizado para a distriubuição das Estações Amostrais em cada UC que justifique testar hipóteses sobre variação nas abundâncias e densidades. Assim, optamos por usar a estratificação espacial para dados de uma mesma espécie em diferentes UCs. Exploramos em maiores detalhes as duas abordagens a seguir.

Estraficação dos dados por Ano de amostragem:

Explorando os dados dentro de cada estrato temporal:

Antes de ajustar os modelos e gerar as estimativas, é importante verificar o número de ocorrências dentro de cada ano. Pois, ao estratificar, ajustaremos uma função de detecção para cada estrato.

Tabela com número de ocorrências por ano para Dasyprocta croconota na Resex Tapajós-Arapiuns

Tabela com dados filtrados. Tabela dinâmica disponível na Parte XXX

Ajustando a função de detecção para os dados estratificados

Até agora, exploramos diferentes abordagens para a Amostragem por Distância convencional e com o uso de Múltiplas Covariávies, e selecionamos o modelo que melhor se ajustou aos dados. Nesta etapa, não vamos testar novos modelos de ajuste. Iremos ajustar o melhor modelo do fluxo anterior aos dados estratificados.

Tabela com o resumo dos resultados de ajuste do modelo para cada ano
Avaliando as estimativas de Abundância e Densidade

Para o uso de covariáveis, as estimativas de abundância/densidade devem ser feitas através do bootstrap.

Estratificação dos dados por Unidade de Conservação

Aqui, vamos explorar para uma mesma espécie, dados de diferentes Unidades de Conservação ao mesmo tempo.

Explorando os dados dentro de cada estrato espacial:

Antes de ajustar os modelos e gerar as estimativas, é importante verificar o número de ocorrências dentro de cada UC. Pois, ao estratificar, ajustaremos uma função de detecção para cada estrato. Caso tenham UCs com um número muito baixo de ocorrências (<30), considerar não incluir na análise.

Tabela com número de ocorrências por Unidade de Conservaçaõ para Dasyprocta croconota

Tabela com dados filtrados. Tabela dinâmica disponível na Parte XXX

Plotando o histograma das frequências de ocorrência pela distância

O histograma interativo está disponível no app em Shiny app_distancia_interativo.R. A distribuição dos dados no histograma permite observar um pico de observações próximo a zero, além de uma considerável perda em detectabilidade a partir dos 20m. Vamos testar diferentes proporções de truncamento.

Testando distância de truncamento (w)

Vamos explorar diferentes distâncias de truncamento para um mesmo modelo de distribuição half-normal. Optamos por truncar os dados pela percentagem para padronizar a rotina para diferentes espécies. Buckland et al. (2001) sugere um corte entre 5-10% das observações detectadas nas maiores distãncias. Vamos selecionar o valor de corte pelo modelo com melhor ajuste.

Tabela com resumo comparativo dos modelos
Plotando o histograma com os dados truncados.
Ajustando diferentes modelos para dados Globais

#AQUI A GENTE PRECISA TOMAR UMA DECISÃO IMPORTANTE

É necessário testar os quatro fluxos: todas/poucas repetições x distancias exatas/agrupadas? Preciso ver os resultados dos fluxos anteriores para planejar melhor esta etapa.

Para a estratificação, vamos testar diretamento os modelos com e sem covariáveis. Vamos nos limitar às distribuições half-normal e hazard-rate, pois são as únicas que comportam o uso das covariáveis.

Half-normal sem termos de ajuste (HN)
HN + Tamanho do grupo (HN + S)
HN + Minutos após o início da amostragem (HN + M)
HN + Tamanho do grupo + Minutos após início da amostragem (HN + S + M)
Hazard-rate sem termos de ajuste (HZ)
HZ + Tamanho do grupo (HZ + S)
HZ + Minutos após o início da amostragem (HZ + M)
HZ + Tamanho do grupo + Minutos após início da amostragem (HZ + S + M)
Comparando os modelos
Tabela com o resumo comparativo dos modelos
Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Para modelos com covariáveis as estimativas de abundância e densidade devem ser feitas por bootstrap

Ajustando diferentes modelos para os dados Estratificados

A redução no tamanho amostral geralmente faz com que os modelos para os dados globais tenham um ajuste melhor que os modelos ajustados aos estratos. Um critério para avaliar este ajuste é comparar o somatório dos valores de AIC para cada estrato com o valor de AIC do modelo global. Se a soma dos valores de AIC dos estratos for menor que o AIC global, significa que o ajuste foi melhor para os dados estratificados.

#AQUI TAMBÉM PRECISA TOMAR UMA DECISÃO IMPORTANTE

Rodamos todos os modelos para os dados estratificados? Ou partimos do melhor modelo para dados globais?

Half-normal sem termos de ajuste (HN)
HN + Tamanho do grupo (HN + S)
HN + Minutos após o início da amostragem (HN + M)
HN + Tamanho do grupo + Minutos após início da amostragem (HN + S + M)
Hazard-rate sem termos de ajuste (HZ)
HZ + Tamanho do grupo (HZ + S)
HZ + Minutos após o início da amostragem (HZ + M)
HZ + Tamanho do grupo + Minutos após início da amostragem (HZ + S + M)
Comparando os modelos
Tabela com o resumo comparativo dos modelos

Olhar também valores brutos de AIC dos modelos globais e comparar com os estratificados.

Gráficos de ajuste das funções de deteção às probabilidades de deteção
Teste de bondade de ajuste dos modelos e Q-Q plots
Avaliando as estimativas de Abundância e Densidade

Para modelos com covariáveis as estimativas de abundância e densidade devem ser feitas por bootstrap

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

plot(cars)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQp0aXRsZTogIkVzdHJ1dHVyYSBkb3MgUmVzdWx0YWRvcyIKb3V0cHV0OiBodG1sX2RvY3VtZW50CmRhdGU6ICIyMDIzLTA1LTIwIgotLS0KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpzb3VyY2UoaGVyZTo6aGVyZSgiUi9taW5oYXNfZnVuY29lcy5SIikpCmBgYAoKIyBGbHV4byBkZSBhbsOhbGlzZSBkb3MgZGFkb3M6CgpBIHNlZ3VpciwgYXByZXNlbnRhbW9zIG8gZmx1eG8gZGUgYW7DoWxpc2UgZG9zIGRhZG9zIHF1ZSBlbnZvbHZlIGEgZmFzZSBleHBsb3JhdMOzcmlhLCB0cnVuY2FtZW50bywgYWp1c3RlIGUgYXZhbGlhw6fDo28gZGUgbW9kZWxvcyBlIGVzdGltYXRpdmFzIGRlIGFidW5kw6JuY2lhIGUgZGVuc2lkYWRlIHBhcmEgYXMgZXNww6ljaWVzIHF1ZSBzZWxlY2lvbmFtb3MgY29tbyBtb2RlbG8uIFVzYW1vcyBjb21vIGNyaXTDqXJpb3MgZGUgc2VsZcOnw6NvIHRhbnRvIG8gbsO6bWVybyBkZSBvY29ycsOqbmNpYXMgcG9yIFVuaWRhZGUgZGUgQ29uc2VydmHDp8OjbyBxdWFudG8gYSBkaXN0cmlidWnDp8OjbyBkYXMgZnJlcXXDqm5jaWFzIGRlIG9ic2VydmHDp8Ojbywgbm9zIGNhc29zIGVtIHF1ZSBpc3NvIGZvaSBwb3Nzw612ZWwuIERlIGZvcm1hIGdlcmFsLCBhcyBlc3DDqWNpZXMgY29tIG7Dum1lcm8gc2F0aXNmYXTDs3JpbyBkZSBvY29ycsOqbmNpYXMgKFw+NjApLCBhcHJlc2VudGFyYW0gcGljbyBkZSBvYnNlcnZhw6fDtWVzIHByw7N4aW1vcyBhIHplcm8uCgpQYXJhIHRvZGFzIGFzIGVzcMOpY2llcyBtb2RlbG8sIG7Ds3MgaW1wbGVtZW50YW1vcyBkdWFzIGVzdHJhdMOpZ2lhcyBwYXJhIGxpZGFyIGNvbSBvcyBlZmVpdG9zIGluZGVzZWphZG9zIG5vcyBkYWRvczogcGljbyBwcsOzeGltbyBhIHplcm8gKCpoZWFwaW5nIG5lYXIgemVybyopIGUgbsO6bWVybyBleGNlc3Npdm8gZGUgcmVwZXRpw6fDtWVzIGFtb3N0cmFpcyBuYSBtZXNtYSB0cmlsaGEuIFBhcmEgbGlkYXIgY29tIG9zIHBpY29zLCB0ZXN0YW1vcyBvIHVzbyBkb3MgZGFkb3MgY29tIGRpc3TDom5jaWFzIGV4YXRhcyBlIGRpc3TDom5jaWFzIGFncnVwYWRhcy4gUGFyYSBsaWRhciBjb20gYXMgcmVwZXRpw6fDtWVzLCB0ZXN0YW1vcyBhIGFuw6FsaXNlIGRvcyBkYWRvcyBjb20gdG9kYXMgYXMgcmVwZXRpw6fDtWVzIGUgY29tIG8gbsO6bWVybyBkZSByZXBldGnDp8O1ZXMgcmVkdXppZGFzLgoKRXNwZWNpZXMgY29tIG1haW9yIG51bWVybyBkZSBvY29ycmVuY2lhcy9VQyBwb3NzaWJpbGl0YW0gdGVzdGFyLCBwb3N0ZXJpb3JtZW50ZSwgZXN0cmF0aWZpY2HDp8O1ZXMgbm9zIGRhZG9zLCBwcmVzZXJ2YW5kbyB1bSBuw7ptZXJvIGRlIG9jb3Jyw6puY2lhcyBzYXRpc2ZhdMOzcmlvIGRlbnRybyBkb3MgZXN0cmF0b3MuIFBvciBpc3NvIGNvbWXDp2Ftb3MgYXByZXNlbnRhbmRvIHVtIGZsdXhvIGNvbXBsZXRvIGRlIGFuw6FsaXNlLCBpbmNsdWluZG8gQW1vc3RyYWdlbSBwb3IgRGlzdMOibmNpYSBDb252ZW5jaW9uYWwsIEFtb3N0cmFnZW0gcG9yIERpc3TDom5jaWEgY29tIE3Dumx0aXBsYXMgQ292YXJpw6F2ZWlzIGUgQW1vc3RyYWdlbSBwb3IgRGlzdMOibmNpYSBjb20gRXN0cmF0aWZpY2HDp8OjbyBub3MgZGFkb3MgY29tIGFzIGVzcMOpY2llcyBjb20gbWFpb3IgbsO6bWVybyBkZSBvY29ycsOqbmNpYS4KCiMjIFBSSU1FSVJPIE1PREVMTyAtIERhc3lwcm9jdGEgY3JvY29ub3RhIC0gUmVzZXggVGFwYWrDs3MgQXJhcGl1bnMKCgohW0ZvbnRlOiBiaW9saWIuY3pdKGh0dHBzOi8vd3d3LmJpb2xpYi5jei9JTUcvR0FML0JJRy8yMDU4NDkuanBnKQoKRXNzYSDDqSBhIGVzcMOpY2llIGNvbSBvIG1haXIgbsO6bWVybyBkZSBvY29ycsOqbmNpYXMgcGFyYSB1bWEgbWVzbWEgVUMuIEFwcmVzZW50b3UsIGNvbW8gYSBtYWlvcmlhIGRhcyBlc3DDqWNpZXMgZW0gZGlmZXJlbnRlcyBVQ3MsIHVtIHBpY28gZGUgb2NvcnLDqm5jaWFzIHByw7N4aW1vIGEgemVyby4KCiMjIyBDYXJyZWdhciBEYWRvcwoKUGFyYSBzZWxlY2lvbmFyIGRvIGNvbmp1bnRvIGRlIGRhZG9zIGRhIGVzcMOpY2llIGUgYSBVbmlkYWRlIGRlIGNvbnNlcnZhw6fDo28gZGUgaW50ZXJlc3NlLCB1c2FyIGEgZnVuw6fDo28gYHRyYW5zZm9ybWFfcGFyYV9kaXN0YW5jZVJfY29tX3JlcGV0aWNhb19maWx0cmFfdWNfc3AoKWAsIGVzcGVjaWZpY2FuZG8gbyBub21lIGRhIFVuaWRhZGUgZGUgY29uc2VydmHDp8OjbyBhdHJhdsOpcyBkbyBhcmd1bWVudG8gYG5vbWVfdWNgIGUgbyBub21lIGRhIGVzcMOpY2llIGF0cmF2w6lzIGRvIGFyZ3VtZW50byBgbm9tZV9zcGAuCgpgYGB7cn0KIyBjYXJyZWdhciBkYWRvcwpjdXRpYV90YXBfYXJhcCA8LSB0cmFuc2Zvcm1hX3BhcmFfZGlzdGFuY2VSX2NvbV9yZXBldGljYW9fZmlsdHJhX3VjX3NwKAogIG5vbWVfdWMgPSAiUmVzZXggVGFwYWpvcy1BcmFwaXVucyIsCiAgbm9tZV9zcCA9ICJEYXN5cHJvY3RhIGNyb2Nvbm90YSIKKSAKCmN1dGlhX3RhcF9hcmFwCmBgYAoKIyMjIEFtb3N0cmFnZW0gcG9yIERpc3TDom5jaWEgQ29udmVuY2lvbmFsCgojIyMjIEZsdXhvIDEgLSBEaXN0w6JuY2lhcyBleGF0YXMgY29tIHRvZGFzIGFzIHJlcGV0acOnw7VlcwoKIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGRhcyBmcmVxdcOqbmNpYXMgZGUgb2NvcnLDqm5jaWEgcGVsYSBkaXN0w6JuY2lhCgpPIGhpc3RvZ3JhbWEgaW50ZXJhdGl2byBlc3TDoSBkaXNwb27DrXZlbCBubyBhcHAgZW0gU2hpbnkgYGFwcF9kaXN0YW5jaWFfaW50ZXJhdGl2by5SYC4gQSBkaXN0cmlidWnDp8OjbyBkb3MgZGFkb3Mgbm8gaGlzdG9ncmFtYSBwZXJtaXRlIG9ic2VydmFyIHVtIHBpY28gZGUgb2JzZXJ2YcOnw7VlcyBwcsOzeGltbyBhIHplcm8sIGFsw6ltIGRlIHVtYSBjb25zaWRlcsOhdmVsIHBlcmRhIGVtIGRldGVjdGFiaWxpZGFkZSBhIHBhcnRpciBkb3MgMjBtLiBWYW1vcyB0ZXN0YXIgZGlmZXJlbnRlcyBwcm9wb3LDp8O1ZXMgZGUgdHJ1bmNhbWVudG8uCgpgYGB7ciwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTEwfQpjdXRpYV90YXBfYXJhcCB8PiAKICBkcm9wX25hKGRpc3RhbmNlKSB8PiAKcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkKYGBgCgojIyMjIyBUZXN0YW5kbyBkaXN0w6JuY2lhIGRlIHRydW5jYW1lbnRvICgqdyopCgpWYW1vcyBleHBsb3JhciBkaWZlcmVudGVzIGRpc3TDom5jaWFzIGRlIHRydW5jYW1lbnRvIHBhcmEgdW0gbWVzbW8gbW9kZWxvIGRlIGRpc3RyaWJ1acOnw6NvIGhhbGYtbm9ybWFsLiBPcHRhbW9zIHBvciB0cnVuY2FyIG9zIGRhZG9zIHBlbGEgcGVyY2VudGFnZW0gcGFyYSBwYWRyb25pemFyIGEgcm90aW5hIHBhcmEgZGlmZXJlbnRlcyBlc3DDqWNpZXMuIEJ1Y2tsYW5kIGV0IGFsLiAoMjAwMSkgc3VnZXJlIHVtIGNvcnRlIGVudHJlIDUtMTAlIGRhcyBvYnNlcnZhw6fDtWVzIGRldGVjdGFkYXMgbmFzIG1haW9yZXMgZGlzdMOjbmNpYXMuIFZhbW9zIHNlbGVjaW9uYXIgbyB2YWxvciBkZSBjb3J0ZSBwZWxvIG1vZGVsbyBjb20gbWVsaG9yIGFqdXN0ZS4KCiMjIyMjIyBUYWJlbGEgY29tIHJlc3VtbyBjb21wYXJhdGl2byBkb3MgbW9kZWxvcwoKYGBge3J9CiMgY29uZHV6IGEgc2VsZWNhbyBkYSBtZWxob3IgZGlzdGFuY2lhIGRlIHRydW5jYW1lbnRvIGEgcGFydGlyIGRvIGFqc3V0ZSBkZSBtb2RlbG9zIGNvbSBmdW5jYW8gZGUgZGV0ZWNjYW8gaGFsZi1ub3JtYWwgc2VtIHRlcm1vcyBkZSBhanVzdGUKY3V0aWFfdGFwX2FyYXBfZGlzdF90cnVuYyA8LSBjdXRpYV90YXBfYXJhcCB8PiAKICBzZWxlY2lvbmFyX2Rpc3RhbmNpYV90cnVuY2FtZW50bygpCgpjdXRpYV90YXBfYXJhcF9kaXN0X3RydW5jJHNlbGVjYW8KYGBgCgojIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGNvbSBvcyBkYWRvcyB0cnVuY2Fkb3MuCgpIaXN0b2dyYW1hcyByZXN1bHRhbnRlcyBkb3MgbW9kZWxvcywgY29tIHRvZGFzIGFzIGRpc3TDom5jaWFzIGRlIHRydW5jYWdlbSwgcGFyYSBhdXhpbGlhciBuYSBzZWxlw6fDo28gZGEgbWVsaG9yIGRpc3TDo25jaWEuCgpgYGB7cn0KcGxvdGFyX2Z1bmNhb19kZXRlY2Nhb19zZWxlY2FvX2Rpc3RhbmNpYV90cnVuY2FtZW50byhjdXRpYV90YXBfYXJhcF9kaXN0X3RydW5jKQpgYGAKCiMjIyMjIEFqdXN0YW5kbyBkaWZlcmVudGVzIG1vZGVsb3MgZGUgZnVuw6fDtWVzIGRlIGRldGXDp8OjbwoKIyMjIyMjIFVuaWZvcm1lIGNvbSB0ZXJtb3MgZGUgYWp1c3RlIENvc3Nlbm8gZSBwb2xpbm9taWFsIHNpbXBsZXMKCmBgYHtyfQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gdW5pZm9ybWUgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAyNSUgZG9zIGRhZG9zCmN1dGlhX3RhcF9hcmFwX3VuaWYgPC0gY3V0aWFfdGFwX2FyYXAgfD4gCiAgYWp1c3RlX21vZGVsb3NfZGlzdGFuY2VfdW5pZih0cnVuY2FtZW50byA9ICIxMCUiKQpgYGAKCiMjIyMjIyBIYWxmLU5vcm1hbCBzZW0gdGVybW9zIGRlIGFqdXN0ZSBlIGNvbSB0ZXJtb3MgZGUgYWp1c3RlIENvc3Nlbm8gZSBQb2xpbm9taWFsIGRlIEhlcm1pdGUKCmBgYHtyfQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAyNSUgZG9zIGRhZG9zCmN1dGlhX3RhcF9hcmFwX2huIDwtIGN1dGlhX3RhcF9hcmFwIHw+IAogIGFqdXN0ZV9tb2RlbG9zX2Rpc3RhbmNlX2huKHRydW5jYW1lbnRvID0gIjEwJSIpCmBgYAoKIyMjIyMjIEhhemFyZC1yYXRlIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIGUgY29tIHRlcm1vcyBkZSBhanVzdGUgQ29zc2VubyBlIFBvbGlub21pYWwgZGUgSGVybWl0ZQoKYGBge3J9CiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYXphcmQtcmF0ZSBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDI1JSBkb3MgZGFkb3MKY3V0aWFfdGFwX2FyYXBfaHIgPC0gY3V0aWFfdGFwX2FyYXAgfD4gCiAgYWp1c3RlX21vZGVsb3NfZGlzdGFuY2VfaHIodHJ1bmNhbWVudG8gPSAiMTAlIikKYGBgCgojIyMjIyBDb21wYXJhbmRvIG9zIG1vZGVsb3MKCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zCgpgYGB7cn0KbGlzdGFfbW9kZWxvc19hanVzdGFkb3MgPC0gbGlzdCgKICBgaGFsZi1ub3JtYWxgID0gY3V0aWFfdGFwX2FyYXBfaG4sIAogIGBoYXphcmQtcmF0ZWAgPSBjdXRpYV90YXBfYXJhcF9ociwgCiAgdW5pZm9ybWUgPSBjdXRpYV90YXBfYXJhcF91bmlmCikKCnNlbGVjYW9fZnVuY2FvX2RldGVjY2FvX3Rlcm1vX2Fqc3V0ZSA8LSBzZWxlY2lvbmFyX2Z1bmNhb19kZXRlY2Nhb190ZXJtb19hanVzdGUobGlzdGFfbW9kZWxvc19hanVzdGFkb3MpCgpzZWxlY2FvX2Z1bmNhb19kZXRlY2Nhb190ZXJtb19hanN1dGUKYGBgCgojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvCgpTdWdlc3TDo286IGFkaWNpb25hciB0w610dWxvIGFvIGdyw6FmaWNvcwpnZXJhciBncmFmaWNvcyB1c2FuZG8gZ2dwbG90MgoKYGBge3J9CiMgZ2VyYXIgdW1hIGxpc3RhIGNvbSBvcyBtb2RlbG9zIHNlbGVjaW9uYWRvcyBvcmRlbmFkb3MgZG8gbWVsaG9yIHBhcmEgbyBwaW9yIG1vZGVsbwptb2RlbG9zX3NlbGVjaW9uYWRvcyA8LSBsaXN0KAogIGN1dGlhX3RhcF9hcmFwX2hyJGBTZW0gdGVybW9gLAogIGN1dGlhX3RhcF9hcmFwX2huJENvc3Nlbm8sCiAgY3V0aWFfdGFwX2FyYXBfdW5pZiRDb3NzZW5vLAogIGN1dGlhX3RhcF9hcmFwX3VuaWYkYFBvbGlub21pYWwgc2ltcGxlc2AsCiAgY3V0aWFfdGFwX2FyYXBfaG4kYFNlbSB0ZXJtb2AKKQoKIyBhdHJpYnVpciBvIG5vbWUgZG9zIG1vZGVsb3MgYW9zIGl0ZW5zIGRhIGxpc3RhCm5hbWVzKG1vZGVsb3Nfc2VsZWNpb25hZG9zKSA8LSBzZWxlY2FvX2Z1bmNhb19kZXRlY2Nhb190ZXJtb19hanN1dGUkTW9kZWwKCiMgcGxvdGFyIGEgcHJvYmFiaWxpZGFkZSBkZSBkZXRlY8Onw6NvIG9ic2VydmFkYSAoYmFycmFzKSBlIGEgZXNwZXJhZGEgKGxpbmhhcyBlIHBvbnRvcykKcGxvdGFyX2Z1bmNhb19kZXRlY2Nhb19tb2RlbG9zX3NlbGVjaW9uYWRvcyhtb2RlbG9zX3NlbGVjaW9uYWRvcykKYGBgCgojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMKCmBgYHtyfQpib25kYWRlX2FqdXN0ZV9mbHV4bzEgPC0gdGVzdGFyX2JvbmRhZGVfYWp1c3RlKG1vZGVsb3Nfc2VsZWNpb25hZG9zLCBwbG90ID0gVFJVRSkKYm9uZGFkZV9hanVzdGVfZmx1eG8xCmBgYAoKIyMjIyMgQXZhbGlhbmRvIGFzIGVzdGltYXRpdmFzIGRlIEFidW5kw6JuY2lhIGUgRGVuc2lkYWRlCgpTdWdlc3TDo28gZGUgYXBlcmZlacOnb2FtZW50byBkYXMgZnVuw6fDtWVzOiBnZXJhciB1bWEgw7puaWNhIHRhYmVsYSBhIHBhcnRpciBkZSB1bSBmdW7Dp8O1ZXMgYGpvaW5gIGUgYHJiaW5kKClgIGRhcyB0YWJlbGFzIGdlcmFkYXMgcG9yIGNhZGEgZnVuw6fDo28sIGFkaWNpb25hbmRvIHVtYSBjb2x1bmEgcXVlIGlkZW50aWZpY2EgY2FkYSB1bSBkb3MgbW9kZWxvcy4KCiMjIyMjIENhcmFjdGVyw61zdGljYXMgZGEgw6FyZWEgZGUgZXN0dWRvIGUgZGEgdGF4YSBkZSBlbmNvbnRybwoKYGBge3J9CiMgZ2VyYSBsaXN0YSBjb250ZW5kbyBvcyBtb2RlbG9zIHNlbGVjaW9uYWRvcyBwYXJhIGNhZGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBlIHRlcm1vIGRlIGFqdXN0ZQpsaXN0YV9tb2RlbG9zX2FqdXN0YWRvc190ZXJtb3MgPC0gbGlzdCgKICBjdXRpYV90YXBfYXJhcF9ociRgU2VtIHRlcm1vYCwKICBjdXRpYV90YXBfYXJhcF9obiRDb3NzZW5vLAogIGN1dGlhX3RhcF9hcmFwX3VuaWYkQ29zc2VubywKICBjdXRpYV90YXBfYXJhcF91bmlmJGBQb2xpbm9taWFsIHNpbXBsZXNgLAogIGN1dGlhX3RhcF9hcmFwX2huJGBTZW0gdGVybW9gCikKCiMgw6FyZWEgZGUgZXN0dWRvLCB0YW1hbmhvIGRhIMOhcmVhIGRlIGVzdHVkbywgYXJlYSBjb2JlcnRhIHBlbG8gZXNmb3LDp28gYW1vc3RyYWwsIGVzZm9yw6dvIGFtb3N0cmFsIGVtIG1ldHJvcywgbsO6bWVybyBkZSBkZXRlY8Onw7VlcywgbsO6bWVybyBkZSB0cmFuc2VjdG9zIChlYSksIHRheGEgZGUgZW5jb250cm8sIGNvZWZpY2llbnRlIGRlIHZhcmlhw6fDo28gZGEgdGF4YSBkZSBlbmNvbnRybyAgCmNhcmFjdGVyaXN0aWNhc19hcmVhX2VzdHVkb190YXhhX2VuY29udHJvIDwtIGxpc3RhX21vZGVsb3NfYWp1c3RhZG9zX3Rlcm1vcyB8PiAKICBnZXJhcl9jYXJhY3RlcmlzdGljYXNfYXJlYV9lc3R1ZG9fdGF4YV9lbmNvbnRybyhyZXN1bHRhZG9fc2VsZWNhb19tb2RlbG9zID0gc2VsZWNhb19mdW5jYW9fZGV0ZWNjYW9fdGVybW9fYWpzdXRlKQoKY2FyYWN0ZXJpc3RpY2FzX2FyZWFfZXN0dWRvX3RheGFfZW5jb250cm8KYGBgCgojIyMjIyBDYXJhY3RlcsOtc3RpY2FzIGRlIGFidW5kw6JuY2lhLCBlc2ZvcsOnbyBlIGRldGVjw6fDo28KCmBgYHtyfQojIMOhcmVhIGRlIGVzdHVkbywgdGFtYW5obyBkYSDDoXJlYSBkZSBlc3R1ZG8sIHRyaWxoYXMgb3UgZXN0YcOnw7VlcyBhbW9zdHJhaXMsIGVzZm9yw6dvIHRvdGFsIGVtIGNhZGEgdHJpbGhhLCBhYnVuZMOibmNpYSBlc3RpbWFkYSBlbSBjYWRhIGVzdGHDp8OjbyBhbW9zdHJhbCwgbsO6bWVybyBkZSBkZXRlY8Onw7VlcyBlbSBjYWRhIGVzdGHDp8OjbyBhbW9zdHJhbCwgw6FyZWEgdG90YWwgYW1vc3RyYWRhCmNhcmFjdGVyaXN0aWNhc19lc2ZvcmNvX2FidW5kYW5jaWFfZGV0ZWNjYW8gPC0gbGlzdGFfbW9kZWxvc19hanVzdGFkb3NfdGVybW9zIHw+IAogIGdlcmFyX2NhcmFjdGVyaXN0aWNhc19lc2ZvcmNvX2FidW5kYW5jaWFfZGV0ZWNjYW8ocmVzdWx0YWRvX3NlbGVjYW9fbW9kZWxvcyA9IHNlbGVjYW9fZnVuY2FvX2RldGVjY2FvX3Rlcm1vX2Fqc3V0ZSkKCmNhcmFjdGVyaXN0aWNhc19lc2ZvcmNvX2FidW5kYW5jaWFfZGV0ZWNjYW8KYGBgCgojIyMjIyBDYXJhY3RlcsOtc3RpY2FzIGRlIGRlbnNpZGFkZQoKYGBge3J9CiMgdG90YWwsIGRlbnNpZGFkZSBlc3RpbWFkYSwgZXJybyBwYWRyw6NvIGRhIGRlbnNpZGFkZSBkZXN0aW1hZGEsIGNvZWZpY2llbnRlIGRlIHZhcmlhw6fDo28gZGEgZGVuc2lkYWRlIGRlc3RpbWFkYSwgaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgaW5mZXJpb3IgZSBzdXBlcmlvciBkbyBjb2VmaWNpZW50ZSBkZSB2YXJpYcOnw6NvLCBncnVhcyBkZSBsaWJlcmRhZGUKY2FyYWN0ZXJpc3RpY2FzX2RlbnNpZGFkZSA8LSBsaXN0YV9tb2RlbG9zX2FqdXN0YWRvc190ZXJtb3MgfD4gCiAgZ2VyYXJfY2FyYWN0ZXJpc3RpY2FzX2RlbnNpZGFkZShyZXN1bHRhZG9fc2VsZWNhb19tb2RlbG9zID0gc2VsZWNhb19mdW5jYW9fZGV0ZWNjYW9fdGVybW9fYWpzdXRlKQoKY2FyYWN0ZXJpc3RpY2FzX2RlbnNpZGFkZQpgYGAKCiMjIyMgRmx1eG8gMiAtIERpc3TDom5jaWFzIGV4YXRhcyBjb20gcmVwZXRpw6fDtWVzIHJlZHV6aWRhcwoKIyMjIyMgRmlsdHJhbmRvIG9zIGRhZG9zIHBhcmEgcmVkdXppciBhcyByZXBldGnDp8O1ZXMKCmBgYHtyfQpkYWRvc19zZWxlY2lvbmFkb3MgPC0gY2FycmVnYXJfZGFkb3Nfc2VsZWNpb25hZG9zKCkKY3V0aWFfdGFwX2FyYXBfcXVhc2Vfc2VtX3JlcGV0aWNhbyA8LSB0cmFuc2Zvcm1hX3BhcmFfZHNpdGFuY2VSX3F1YXNlX3NlbV9yZXBldGljYW9fZmlsdHJhX3VjX3NwKAogIGRhZG9zID0gZGFkb3Nfc2VsZWNpb25hZG9zLAogIG5vbWVfdWMgPSAiUmVzZXggVGFwYWpvcy1BcmFwaXVucyIsCiAgbm9tZV9zcCA9ICJEYXN5cHJvY3RhIGNyb2Nvbm90YSIKKQoKY3V0aWFfdGFwX2FyYXBfcXVhc2Vfc2VtX3JlcGV0aWNhbwpgYGAKCiMjIyMjIFBsb3RhbmRvIG8gaGlzdG9ncmFtYSBkYXMgZnJlcXXDqm5jaWFzIGRlIG9jb3Jyw6puY2lhIHBlbGEgZGlzdMOibmNpYQoKTyBoaXN0b2dyYW1hIGludGVyYXRpdm8gZXN0w6EgZGlzcG9uw612ZWwgbm8gYXBwIGVtIFNoaW55IGBhcHBfZGlzdGFuY2lhX2ludGVyYXRpdm8uUmAuIEEgZGlzdHJpYnVpw6fDo28gZG9zIGRhZG9zIG5vIGhpc3RvZ3JhbWEgcGVybWl0ZSBvYnNlcnZhciB1bSBwaWNvIGRlIG9ic2VydmHDp8O1ZXMgcHLDs3hpbW8gYSB6ZXJvLCBhbMOpbSBkZSB1bWEgY29uc2lkZXLDoXZlbCBwZXJkYSBlbSBkZXRlY3RhYmlsaWRhZGUgYSBwYXJ0aXIgZG9zIDIwbS4gVmFtb3MgdGVzdGFyIGRpZmVyZW50ZXMgcHJvcG9yw6fDtWVzIGRlIHRydW5jYW1lbnRvLgoKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0KY3V0aWFfdGFwX2FyYXBfcXVhc2Vfc2VtX3JlcGV0aWNhbyB8PiAKICBkcm9wX25hKGRpc3RhbmNlKSB8PiAKcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkKYGBgCgojIyMjIyBUZXN0YW5kbyBkaXN0w6JuY2lhIGRlIHRydW5jYW1lbnRvICgqdyopCgpWYW1vcyBleHBsb3JhciBkaWZlcmVudGVzIGRpc3TDom5jaWFzIGRlIHRydW5jYW1lbnRvIHBhcmEgdW0gbWVzbW8gbW9kZWxvIGRlIGRpc3RyaWJ1acOnw6NvIGhhbGYtbm9ybWFsLiBPcHRhbW9zIHBvciB0cnVuY2FyIG9zIGRhZG9zIHBlbGEgcGVyY2VudGFnZW0gcGFyYSBwYWRyb25pemFyIGEgcm90aW5hIHBhcmEgZGlmZXJlbnRlcyBlc3DDqWNpZXMuIEJ1Y2tsYW5kIGV0IGFsLiAoMjAwMSkgc3VnZXJlIHVtIGNvcnRlIGVudHJlIDUtMTAlIGRhcyBvYnNlcnZhw6fDtWVzIGRldGVjdGFkYXMgbmFzIG1haW9yZXMgZGlzdMOjbmNpYXMuIFZhbW9zIHNlbGVjaW9uYXIgbyB2YWxvciBkZSBjb3J0ZSBwZWxvIG1vZGVsbyBjb20gbWVsaG9yIGFqdXN0ZS4KCiMjIyMjIyBUYWJlbGEgY29tIHJlc3VtbyBjb21wYXJhdGl2byBkb3MgbW9kZWxvcwoKYGBge3J9CiMgY29uZHV6IGEgc2VsZWNhbyBkYSBtZWxob3IgZGlzdGFuY2lhIGRlIHRydW5jYW1lbnRvIGEgcGFydGlyIGRvIGFqc3V0ZSBkZSBtb2RlbG9zIGNvbSBmdW5jYW8gZGUgZGV0ZWNjYW8gaGFsZi1ub3JtYWwgc2VtIHRlcm1vcyBkZSBhanVzdGUKY3V0aWFfdGFwX2FyYXBfcXVhc2Vfc2VtX3JlcGV0aWNhb19kaXN0X3RydW5jIDwtIGN1dGlhX3RhcF9hcmFwX3F1YXNlX3NlbV9yZXBldGljYW8gfD4gCiAgc2VsZWNpb25hcl9kaXN0YW5jaWFfdHJ1bmNhbWVudG8oKQoKY3V0aWFfdGFwX2FyYXBfcXVhc2Vfc2VtX3JlcGV0aWNhb19kaXN0X3RydW5jJHNlbGVjYW8KYGBgCgojIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGNvbSBvcyBkYWRvcyB0cnVuY2Fkb3MuCgpgYGB7cn0KcGxvdGFyX2Z1bmNhb19kZXRlY2Nhb19zZWxlY2FvX2Rpc3RhbmNpYV90cnVuY2FtZW50byhjdXRpYV90YXBfYXJhcF9xdWFzZV9zZW1fcmVwZXRpY2FvX2Rpc3RfdHJ1bmMpCmBgYAoKIyMjIyMgQWp1c3RhbmRvIGRpZmVyZW50ZXMgbW9kZWxvcyBkZSBmdW7Dp8O1ZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVW5pZm9ybWUgKyBDb3NzZW5vCgojIyMjIyMgSGFsZi1Ob3JtYWwgc2VtIHRlcm1vcyBkZSBhanVzdGUgZSBjb20gdGVybW9zIGRlIGFqdXN0ZQoKIyMjIyMjIEhhemFyZC1yYXRlIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIGUgY29tIHRlcm1vcyBkZSBhanVzdGUKCiMjIyMjIENvbXBhcmFuZG8gb3MgbW9kZWxvcwoKIyMjIyMjIFRhYmVsYSBjb20gbyByZXN1bW8gY29tcGFyYXRpdm8gZG9zIG1vZGVsb3MKCiMjIyMjIyBHcsOhZmljb3MgZGUgYWp1c3RlIGRhcyBmdW7Dp8O1ZXMgZGUgZGV0ZcOnw6NvIMOgcyBwcm9iYWJpbGlkYWRlcyBkZSBkZXRlw6fDo28KCiMjIyMjIyBUZXN0ZSBkZSBib25kYWRlIGRlIGFqdXN0ZSBkb3MgbW9kZWxvcyBlIFEtUSBwbG90cwoKIyMjIyMgQXZhbGlhbmRvIGFzIGVzdGltYXRpdmFzIGRlIEFidW5kw6JuY2lhIGUgRGVuc2lkYWRlCgojIyMjIEZsdXhvIDMgLSBEaXN0w6JuY2lhcyBhZ3J1cGFkYXMgY29tIHRvZGFzIGFzIHJlcGV0acOnw7VlcwoKIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGRhcyBmcmVxdcOqbmNpYXMgZGUgb2NvcnLDqm5jaWEgcGVsYSBkaXN0w6JuY2lhCgpPIGhpc3RvZ3JhbWEgaW50ZXJhdGl2byBlc3TDoSBkaXNwb27DrXZlbCBubyBhcHAgZW0gU2hpbnkgYGFwcF9kaXN0YW5jaWFfaW50ZXJhdGl2by5SYC4gQSBkaXN0cmlidWnDp8OjbyBkb3MgZGFkb3Mgbm8gaGlzdG9ncmFtYSBwZXJtaXRlIG9ic2VydmFyIHVtIHBpY28gZGUgb2JzZXJ2YcOnw7VlcyBwcsOzeGltbyBhIHplcm8sIGFsw6ltIGRlIHVtYSBjb25zaWRlcsOhdmVsIHBlcmRhIGVtIGRldGVjdGFiaWxpZGFkZSBhIHBhcnRpciBkb3MgMjBtLiBWYW1vcyB0ZXN0YXIgZGlmZXJlbnRlcyBwcm9wb3LDp8O1ZXMgZGUgdHJ1bmNhbWVudG8uCgojIyMjIyBUZXN0YW5kbyBkaXN0w6JuY2lhIGRlIHRydW5jYW1lbnRvICgqdyopCgpWYW1vcyBleHBsb3JhciBkaWZlcmVudGVzIGRpc3TDom5jaWFzIGRlIHRydW5jYW1lbnRvIHBhcmEgdW0gbWVzbW8gbW9kZWxvIGRlIGRpc3RyaWJ1acOnw6NvIGhhbGYtbm9ybWFsLiBPcHRhbW9zIHBvciB0cnVuY2FyIG9zIGRhZG9zIHBlbGEgcGVyY2VudGFnZW0gcGFyYSBwYWRyb25pemFyIGEgcm90aW5hIHBhcmEgZGlmZXJlbnRlcyBlc3DDqWNpZXMuIEJ1Y2tsYW5kIGV0IGFsLiAoMjAwMSkgc3VnZXJlIHVtIGNvcnRlIGVudHJlIDUtMTAlIGRhcyBvYnNlcnZhw6fDtWVzIGRldGVjdGFkYXMgbmFzIG1haW9yZXMgZGlzdMOjbmNpYXMuIFZhbW9zIHNlbGVjaW9uYXIgbyB2YWxvciBkZSBjb3J0ZSBwZWxvIG1vZGVsbyBjb20gbWVsaG9yIGFqdXN0ZS4KCiMjIyMjIyBUYWJlbGEgY29tIHJlc3VtbyBjb21wYXJhdGl2byBkb3MgbW9kZWxvcwoKIyMjIyMjIFBsb3RhbmRvIG8gaGlzdG9ncmFtYSBjb20gb3MgZGFkb3MgdHJ1bmNhZG9zLgoKIyMjIyMgQWp1c3RhbmRvIGRpZmVyZW50ZXMgbW9kZWxvcyBkZSBmdW7Dp8O1ZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVW5pZm9ybWUgKyBDb3NzZW5vCgojIyMjIyMgSGFsZi1Ob3JtYWwgc2VtIHRlcm1vcyBkZSBhanVzdGUgZSBjb20gdGVybW9zIGRlIGFqdXN0ZQoKIyMjIyMjIEhhemFyZC1yYXRlIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIGUgY29tIHRlcm1vcyBkZSBhanVzdGUKCiMjIyMjIENvbXBhcmFuZG8gb3MgbW9kZWxvcwoKIyMjIyMjIFRhYmVsYSBjb20gbyByZXN1bW8gY29tcGFyYXRpdm8gZG9zIG1vZGVsb3MKCiMjIyMjIyBHcsOhZmljb3MgZGUgYWp1c3RlIGRhcyBmdW7Dp8O1ZXMgZGUgZGV0ZcOnw6NvIMOgcyBwcm9iYWJpbGlkYWRlcyBkZSBkZXRlw6fDo28KCiMjIyMjIyBUZXN0ZSBkZSBib25kYWRlIGRlIGFqdXN0ZSBkb3MgbW9kZWxvcyBlIFEtUSBwbG90cwoKIyMjIyMgQXZhbGlhbmRvIGFzIGVzdGltYXRpdmFzIGRlIEFidW5kw6JuY2lhIGUgRGVuc2lkYWRlCgojIyMjIEZsdXhvIDQgLSBEaXN0w6JuY2lhcyBhZ3J1cGFkYXMgY29tIHJlcGV0acOnw7VlcyByZWR1emlkYXMKCiMjIyMjIFBsb3RhbmRvIG8gaGlzdG9ncmFtYSBkYXMgZnJlcXXDqm5jaWFzIGRlIG9jb3Jyw6puY2lhIHBlbGEgZGlzdMOibmNpYQoKTyBoaXN0b2dyYW1hIGludGVyYXRpdm8gZXN0w6EgZGlzcG9uw612ZWwgbm8gYXBwIGVtIFNoaW55IGBhcHBfZGlzdGFuY2lhX2ludGVyYXRpdm8uUmAuIEEgZGlzdHJpYnVpw6fDo28gZG9zIGRhZG9zIG5vIGhpc3RvZ3JhbWEgcGVybWl0ZSBvYnNlcnZhciB1bSBwaWNvIGRlIG9ic2VydmHDp8O1ZXMgcHLDs3hpbW8gYSB6ZXJvLCBhbMOpbSBkZSB1bWEgY29uc2lkZXLDoXZlbCBwZXJkYSBlbSBkZXRlY3RhYmlsaWRhZGUgYSBwYXJ0aXIgZG9zIDIwbS4gVmFtb3MgdGVzdGFyIGRpZmVyZW50ZXMgcHJvcG9yw6fDtWVzIGRlIHRydW5jYW1lbnRvLgoKIyMjIyMgVGVzdGFuZG8gZGlzdMOibmNpYSBkZSB0cnVuY2FtZW50byAoKncqKQoKVmFtb3MgZXhwbG9yYXIgZGlmZXJlbnRlcyBkaXN0w6JuY2lhcyBkZSB0cnVuY2FtZW50byBwYXJhIHVtIG1lc21vIG1vZGVsbyBkZSBkaXN0cmlidWnDp8OjbyBoYWxmLW5vcm1hbC4gT3B0YW1vcyBwb3IgdHJ1bmNhciBvcyBkYWRvcyBwZWxhIHBlcmNlbnRhZ2VtIHBhcmEgcGFkcm9uaXphciBhIHJvdGluYSBwYXJhIGRpZmVyZW50ZXMgZXNww6ljaWVzLiBCdWNrbGFuZCBldCBhbC4gKDIwMDEpIHN1Z2VyZSB1bSBjb3J0ZSBlbnRyZSA1LTEwJSBkYXMgb2JzZXJ2YcOnw7VlcyBkZXRlY3RhZGFzIG5hcyBtYWlvcmVzIGRpc3TDo25jaWFzLiBWYW1vcyBzZWxlY2lvbmFyIG8gdmFsb3IgZGUgY29ydGUgcGVsbyBtb2RlbG8gY29tIG1lbGhvciBhanVzdGUuCgojIyMjIyMgVGFiZWxhIGNvbSByZXN1bW8gY29tcGFyYXRpdm8gZG9zIG1vZGVsb3MKCiMjIyMjIyBQbG90YW5kbyBvIGhpc3RvZ3JhbWEgY29tIG9zIGRhZG9zIHRydW5jYWRvcy4KCiMjIyMjIEFqdXN0YW5kbyBkaWZlcmVudGVzIG1vZGVsb3MgZGUgZnVuw6fDtWVzIGRlIGRldGXDp8OjbwoKIyMjIyMjIFVuaWZvcm1lICsgQ29zc2VubwoKIyMjIyMjIEhhbGYtTm9ybWFsIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIGUgY29tIHRlcm1vcyBkZSBhanVzdGUKCiMjIyMjIyBIYXphcmQtcmF0ZSBzZW0gdGVybW9zIGRlIGFqdXN0ZSBlIGNvbSB0ZXJtb3MgZGUgYWp1c3RlCgojIyMjIyBDb21wYXJhbmRvIG9zIG1vZGVsb3MKCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zCgojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMKCiMjIyMjIEF2YWxpYW5kbyBhcyBlc3RpbWF0aXZhcyBkZSBBYnVuZMOibmNpYSBlIERlbnNpZGFkZQoKIyMjIEFtb3N0cmFnZW0gcG9yIERpc3TDom5jaWEgY29tIE3Dumx0aXBsYXMgQ292YXJpw6F2ZWlzCgpBcMOzcyB0ZXN0YXIgYXMgcXVhdHJvIGVzdHJhdMOpZ2lhcyBhbnRlcmlvcmVzIHBhcmEgbGlkYXIgY29tIGVmZWl0b3MgaW5kZXNlamFkb3Mgbm9zIGRhZG9zLCBlc2NvbGhlbW9zIGEgZXN0cmF0w6lnaWEgY29tIG1lbGhvcmVzIHJlc3VsdGFkb3MsIGNvbnNpZGVyYW5kbyBhIGJvbmRhZGUgZGUgYWp1c3RlIGRvcyBtb2RlbG9zIGUgb3MgY29lZmljaWVudGVzIGRlIHZhcmlhw6fDo28gZGFzIGVzdGltYXRpdmFzIGRlIGFidW5kw6JuY2lhIGUgZGVuc2lkYWRlLCBwYXJhIGFkaWNpb25hciBjb3ZhcmnDoXZpZXMuIENvbnNpZGVyYW1vcywgY29tIGJhc2Ugbm9zIGRhZG9zIGRvIFByb2dyYW1hIE1vbml0b3JhLCBkdWFzIGNvdmFyacOhdmVpcy4gQSBwcmltZWlyYSBkZWxhLCB0YW1hbmhvIGRvIGdydXBvLiBEZSBmb3JtYSBnZXJhbCwgcG9kZSBleGlzdGlyIHVtYSB0ZW5kw6puY2lhIGEgdW0gdmnDqXMgbm8gdGFtYW5obyBkbyBncnVwbyBjb20gYSBkaXN0w6JuY2lhLCBjb20gYSBwZXJkYSBkZSBkZXRlY3RhYmlsaWRhZGUgcGFyYSBncnVwb3MgbWVub3Jlcy4gQWzDqW0gZGlzc28sIG8gdGFtYW5obyBkbyBncnVwbyB0YW1iw6ltIMOpIHV0aWxpemFkbyBwYXJhIGNvcnJpZ2lyIGFzIGVzdGltYXRpdmFzIGRlIGFidWTDom5jaWEgZSBkZW5zaWRhZGUuIEEgb3V0cmEgY292YXJpw6F2ZWwgY3JpYW1vcyBhIHBhcnRpciBkb3MgZGFkb3MgZGUgaG9yw6FyaW8gZGUgaW7DrWNpbyBlIGhvcsOhcmlvIGRlIHJlZ2lzdHJvIGRhcyBlc3DDqWNpZXMsIGNhbGN1bGFuZG8gb3MgbWludXRvcyBhcMOzcyBvIGluw61jaW8gZGEgYW1vc3RyYWdlbS4gTXVpdGFzIGVzcMOpY2llcyB2YXJpYW0gc3VhIGF0aXZpZGFkZSBhbyBsb25nbyBkbyBkaWEsIGUgcG9kZW0gc2VyIG1haXMgb3UgbWVub3MgZGV0ZWN0w6F2ZWlzIGRlIGFjb3JkbyBjb20gbyBob3LDoXJpby4KCiMjIyMgRXhwbG9yYW5kbyBjb3ZhcmnDoXZlaXMKCiMjIyMjIEdyw6FmaWNvcyBleHBsb3JhdMOzcmlvcwoKIyMjIyMjIERpc3TDom5jaWEgeCBUYW1hbmhvIGRvIGdydXBvCgojIyMjIyMgRGlzdMOibmNpYSB4IE1pbnV0b3MgYXDDs3MgbyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0KCiMjIyMjIEFqdXN0YW5kbyBkaWZlcmVudGVzIG1vZGVsb3MgY29tIGNvdmFyacOhdmVpcwoKUGFyYSBvIHVzbyBkZSBjb3ZlcmnDoXZlaXMsIHBvZGVtb3MgdXNhciBzb21lbnRlIGFzIGRpc3RyaWJ1acOnw7VlcyBoYWxmLW5vcm1hbCBvdSBoYXphcmQtcmF0ZSwgcG9pcyBhbWJhcyBwb3NzdWVtIG8gcGFyw6JtZXRybyBlc2NhbGFyIHBlbG8gcXVhbCBvIHZldG9yIGRhcyBjb3ZhcmnDoXZlaXMgc2Vyw6EgbXVsdGlwbGljYWRvLiBOw6NvIMOpIHJlY29tZW5kw6F2ZWwgbyB1c28gZGUgdGVybW9zIGRlIGFqdXN0ZSBjb20gbyB1c28gZGUgY292YXJpw6F2ZWlzIHBlbGEgZ3JhbmRlIGNoYW5jZSBkZSBwZXJkYSBkZSBtb25vdG9uaWNpZGFkZSBuYXMgY3VydmFzIGRhcyBmdW7Dp8O1ZXMgZGUgZGV0ZWPDp8Ojby4gQXNzaW0sIHZhbW9zIHRyYWJhbGhhciBjb20gYXMgc2VndWludGVzIGNvbWJpbmHDp8O1ZXMgZGUgbW9kZWxvcwoKIyMjIyMjIEhhbGYtbm9ybWFsIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIChITikKCiMjIyMjIyBITiArIFRhbWFuaG8gZG8gZ3J1cG8gKEhOICsgUykKCiMjIyMjIyBITiArIE1pbnV0b3MgYXDDs3MgbyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0gKEhOICsgTSkKCiMjIyMjIyBITiArIFRhbWFuaG8gZG8gZ3J1cG8gKyBNaW51dG9zIGFww7NzIGluw61jaW8gZGEgYW1vc3RyYWdlbSAoSE4gKyBTICsgTSkKCiMjIyMjIyBIYXphcmQtcmF0ZSBzZW0gdGVybW9zIGRlIGFqdXN0ZSAoSFopCgojIyMjIyMgSFogKyBUYW1hbmhvIGRvIGdydXBvIChIWiArIFMpCgojIyMjIyMgSFogKyBNaW51dG9zIGFww7NzIG8gaW7DrWNpbyBkYSBhbW9zdHJhZ2VtIChIWiArIE0pCgojIyMjIyMgSFogKyBUYW1hbmhvIGRvIGdydXBvICsgTWludXRvcyBhcMOzcyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0gKEhaICsgUyArIE0pCgojIyMjIyBDb21wYXJhbmRvIG9zIG1vZGVsb3MKCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zCgojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMKCiMjIyMjIEF2YWxpYW5kbyBhcyBlc3RpbWF0aXZhcyBkZSBBYnVuZMOibmNpYSBlIERlbnNpZGFkZQoKUGFyYSBvIHVzbyBkZSBjb3ZhcmnDoXZlaXMsIGFzIGVzdGltYXRpdmFzIGRlIGFidW5kw6JuY2lhL2RlbnNpZGFkZSBkZXZlbSBzZXIgZmVpdGFzIGF0cmF2w6lzIGRvIGJvb3RzdHJhcC4KCiMjIyBBbW9zdHJhZ2VtIHBvciBEaXN0w6JuY2lhIGNvbSBFc3RyYXRpZmljYcOnw6NvCgpPIHVzbyBkYSBlc3RyYXRpZmljYcOnw6NvLCBubyBjYXNvIGRvcyBkYWRvcyBkbyBwcm9nYW1hIG1vbml0b3JhLCBwb2RlIHNlciB1c2FkbyBhIHBhcnRpciBkZSBkdWFzIGFib3JkYWdlbnMuIEEgcHJpbWVpcmEgZGVsYXMgc2VyaWEgZm9jYWRhIG5hIGRpbsOibWljYSBwb3B1bGFjaW9uYWwsIHBhcmEgZXN0aW1hciBhYnVuZMOibmNpYXMgZSBkZW5zaWRhZGVzIGVtIHBlcsOtb2RvcyBhbW9zdHJhaXMgZGlmZXJlbnRlcyBlIGFjb21wYW5oYXIgbyB0YW1hbmhvIGRhIHBvcHVsYcOnw6NvIGFvIGxvbmdvIGRvIHRlbXBvLiBQYXJhIGVzc2EgYWJvcmRhZ2VtLCBlc3RyYXRpZmljYXIgb3MgZGFkb3MgcG9yIGFubyBwZXJtaXRlIHF1ZSBzZWphbSBmZWl0YXMgZXN0YXMgZXN0aW1hdGl2YXMuIE8gcGFjb3RlIERpc3RhbmNlIHBhcmEgbyBSIMOpIG1haXMgbGltaXRhZG8gcXVlIG8gcHJvZ3JhbWEgRGlzdGFuY2UgcGFyYSBvIFdpbmRvd3MgZW0gdGVybW9zIGRlIG9ww6fDtWVzIGRlIGNvbWFuZG8gcGFyYSBlc3RyYXRpZmljYXIgb3MgZGFkb3MgcG9yIGFtb3N0cmFnZW0sIGUgZW50ZW5kZSBhIGVzdHJhdGlmaWNhw6fDo28gYXRyYXbDqXMgZGEgdmFyacOhdmVsIGBSZWdpb24uTGFiZWxgLCB1c2FkYSBwYXJhIGluZm9ybWFyIGVzdHJhdGlmaWNhw6fDo28gZXNwYWNpYWwuIENvbW8gYSBub3NzYSBpbnRlbsOnw6NvIMOpIGVzdHJhdGlmaWNhciBwb3IgYW5vLCB2YW1vcyBpbnNlcmlyIG9zIGFub3MgY29tbyBlc3RyYXRvcyBuYSB2YXJpw6F2ZWwgYFJlZ2lvbi5MYWJlbGAsIGFzc3VtaW5kbyBxdWUgc2UgdHJhdGFtIGRlIGFtb3N0cmFzIGRpZmVyZW50ZXMsIHBvaXMgbm9zc28gaW50ZXJlc3NlIGVzdMOhIG5hIHZhcmlhw6fDo28gbm9zIGRhZG9zLCBpbmRlcGVuZGVudGUgZGEgZm9udGUgZGUgdmFyaWHDp8OjbyBzZXIgZXNwYWNpYWwgb3UgdGVtcG9yYWwuCgpVbWEgb3V0cmEgYWJvcmRhZ2VtIHBvc3PDrXZlbCDDqSB1c2FyIGEgZXN0cmF0aWZpY2HDp8OjbyBlc3BhY2lhbC4gTm8gY2FzbyBkb3MgZGFkb3MgZG8gUHJvZ3JhbWEgTW9uaXRvcmEsIGEgdmFyaWHDp8OjbyBlbnRyZSBhcyBVQ3MgcGFyYSB1bWEgbWVzbWEgZXNww6ljaWUgcGFyZWNlIHNlciBtYWlzIHJlbGV2YW50ZSBxdWUgYSB2YXJpYcOnw6NvIGRlbnRybyBkZSB1bWEgbWVzbWEgVUMsIHBvaXMgZW50ZW5kZW1vcyBxdWUgbsOjbyBow6EgdW0gZGVzZW5obyBhbW9zdHJhbCBzaXN0ZW1hdGl6YWRvIHBhcmEgYSBkaXN0cml1YnVpw6fDo28gZGFzIEVzdGHDp8O1ZXMgQW1vc3RyYWlzIGVtIGNhZGEgVUMgcXVlIGp1c3RpZmlxdWUgdGVzdGFyIGhpcMOzdGVzZXMgc29icmUgdmFyaWHDp8OjbyBuYXMgYWJ1bmTDom5jaWFzIGUgZGVuc2lkYWRlcy4gQXNzaW0sIG9wdGFtb3MgcG9yIHVzYXIgYSBlc3RyYXRpZmljYcOnw6NvIGVzcGFjaWFsIHBhcmEgZGFkb3MgZGUgdW1hIG1lc21hIGVzcMOpY2llIGVtIGRpZmVyZW50ZXMgVUNzLiBFeHBsb3JhbW9zIGVtIG1haW9yZXMgZGV0YWxoZXMgYXMgZHVhcyBhYm9yZGFnZW5zIGEgc2VndWlyLgoKIyMjIyBFc3RyYWZpY2HDp8OjbyBkb3MgZGFkb3MgcG9yIEFubyBkZSBhbW9zdHJhZ2VtOgoKIyMjIyMgRXhwbG9yYW5kbyBvcyBkYWRvcyBkZW50cm8gZGUgY2FkYSBlc3RyYXRvIHRlbXBvcmFsOgoKQW50ZXMgZGUgYWp1c3RhciBvcyBtb2RlbG9zIGUgZ2VyYXIgYXMgZXN0aW1hdGl2YXMsIMOpIGltcG9ydGFudGUgdmVyaWZpY2FyIG8gbsO6bWVybyBkZSBvY29ycsOqbmNpYXMgZGVudHJvIGRlIGNhZGEgYW5vLiBQb2lzLCBhbyBlc3RyYXRpZmljYXIsIGFqdXN0YXJlbW9zIHVtYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIHBhcmEgY2FkYSBlc3RyYXRvLgoKIyMjIyMjIFRhYmVsYSBjb20gbsO6bWVybyBkZSBvY29ycsOqbmNpYXMgcG9yIGFubyBwYXJhIERhc3lwcm9jdGEgY3JvY29ub3RhIG5hIFJlc2V4IFRhcGFqw7NzLUFyYXBpdW5zCgpUYWJlbGEgY29tIGRhZG9zIGZpbHRyYWRvcy4gVGFiZWxhIGRpbsOibWljYSBkaXNwb27DrXZlbCBuYSAqKlBhcnRlIFhYWCoqCgojIyMjIyBBanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIHBhcmEgb3MgZGFkb3MgZXN0cmF0aWZpY2Fkb3MKCkF0w6kgYWdvcmEsIGV4cGxvcmFtb3MgZGlmZXJlbnRlcyBhYm9yZGFnZW5zIHBhcmEgYSBBbW9zdHJhZ2VtIHBvciBEaXN0w6JuY2lhIGNvbnZlbmNpb25hbCBlIGNvbSBvIHVzbyBkZSBNw7psdGlwbGFzIENvdmFyacOhdmllcywgZSBzZWxlY2lvbmFtb3MgbyBtb2RlbG8gcXVlIG1lbGhvciBzZSBhanVzdG91IGFvcyBkYWRvcy4gTmVzdGEgZXRhcGEsIG7Do28gdmFtb3MgdGVzdGFyIG5vdm9zIG1vZGVsb3MgZGUgYWp1c3RlLiBJcmVtb3MgYWp1c3RhciBvIG1lbGhvciBtb2RlbG8gZG8gZmx1eG8gYW50ZXJpb3IgYW9zIGRhZG9zIGVzdHJhdGlmaWNhZG9zLgoKIyMjIyMjIFRhYmVsYSBjb20gbyByZXN1bW8gZG9zIHJlc3VsdGFkb3MgZGUgYWp1c3RlIGRvIG1vZGVsbyBwYXJhIGNhZGEgYW5vCgojIyMjIyBBdmFsaWFuZG8gYXMgZXN0aW1hdGl2YXMgZGUgQWJ1bmTDom5jaWEgZSBEZW5zaWRhZGUKClBhcmEgbyB1c28gZGUgY292YXJpw6F2ZWlzLCBhcyBlc3RpbWF0aXZhcyBkZSBhYnVuZMOibmNpYS9kZW5zaWRhZGUgZGV2ZW0gc2VyIGZlaXRhcyBhdHJhdsOpcyBkbyBib290c3RyYXAuCgojIyMjIEVzdHJhdGlmaWNhw6fDo28gZG9zIGRhZG9zIHBvciBVbmlkYWRlIGRlIENvbnNlcnZhw6fDo28KCkFxdWksIHZhbW9zIGV4cGxvcmFyIHBhcmEgdW1hIG1lc21hIGVzcMOpY2llLCBkYWRvcyBkZSBkaWZlcmVudGVzIFVuaWRhZGVzIGRlIENvbnNlcnZhw6fDo28gYW8gbWVzbW8gdGVtcG8uCgojIyMjIyBFeHBsb3JhbmRvIG9zIGRhZG9zIGRlbnRybyBkZSBjYWRhIGVzdHJhdG8gZXNwYWNpYWw6CgpBbnRlcyBkZSBhanVzdGFyIG9zIG1vZGVsb3MgZSBnZXJhciBhcyBlc3RpbWF0aXZhcywgw6kgaW1wb3J0YW50ZSB2ZXJpZmljYXIgbyBuw7ptZXJvIGRlIG9jb3Jyw6puY2lhcyBkZW50cm8gZGUgY2FkYSBVQy4gUG9pcywgYW8gZXN0cmF0aWZpY2FyLCBhanVzdGFyZW1vcyB1bWEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBwYXJhIGNhZGEgZXN0cmF0by4gQ2FzbyB0ZW5oYW0gVUNzIGNvbSB1bSBuw7ptZXJvIG11aXRvIGJhaXhvIGRlIG9jb3Jyw6puY2lhcyAoXDwzMCksIGNvbnNpZGVyYXIgbsOjbyBpbmNsdWlyIG5hIGFuw6FsaXNlLgoKIyMjIyMjIFRhYmVsYSBjb20gbsO6bWVybyBkZSBvY29ycsOqbmNpYXMgcG9yIFVuaWRhZGUgZGUgQ29uc2VydmHDp2HDtSBwYXJhIERhc3lwcm9jdGEgY3JvY29ub3RhCgpUYWJlbGEgY29tIGRhZG9zIGZpbHRyYWRvcy4gVGFiZWxhIGRpbsOibWljYSBkaXNwb27DrXZlbCBuYSAqKlBhcnRlIFhYWCoqCgojIyMjIyBQbG90YW5kbyBvIGhpc3RvZ3JhbWEgZGFzIGZyZXF1w6puY2lhcyBkZSBvY29ycsOqbmNpYSBwZWxhIGRpc3TDom5jaWEKCk8gaGlzdG9ncmFtYSBpbnRlcmF0aXZvIGVzdMOhIGRpc3BvbsOtdmVsIG5vIGFwcCBlbSBTaGlueSBgYXBwX2Rpc3RhbmNpYV9pbnRlcmF0aXZvLlJgLiBBIGRpc3RyaWJ1acOnw6NvIGRvcyBkYWRvcyBubyBoaXN0b2dyYW1hIHBlcm1pdGUgb2JzZXJ2YXIgdW0gcGljbyBkZSBvYnNlcnZhw6fDtWVzIHByw7N4aW1vIGEgemVybywgYWzDqW0gZGUgdW1hIGNvbnNpZGVyw6F2ZWwgcGVyZGEgZW0gZGV0ZWN0YWJpbGlkYWRlIGEgcGFydGlyIGRvcyAyMG0uIFZhbW9zIHRlc3RhciBkaWZlcmVudGVzIHByb3BvcsOnw7VlcyBkZSB0cnVuY2FtZW50by4KCiMjIyMjIFRlc3RhbmRvIGRpc3TDom5jaWEgZGUgdHJ1bmNhbWVudG8gKCp3KikKClZhbW9zIGV4cGxvcmFyIGRpZmVyZW50ZXMgZGlzdMOibmNpYXMgZGUgdHJ1bmNhbWVudG8gcGFyYSB1bSBtZXNtbyBtb2RlbG8gZGUgZGlzdHJpYnVpw6fDo28gaGFsZi1ub3JtYWwuIE9wdGFtb3MgcG9yIHRydW5jYXIgb3MgZGFkb3MgcGVsYSBwZXJjZW50YWdlbSBwYXJhIHBhZHJvbml6YXIgYSByb3RpbmEgcGFyYSBkaWZlcmVudGVzIGVzcMOpY2llcy4gQnVja2xhbmQgZXQgYWwuICgyMDAxKSBzdWdlcmUgdW0gY29ydGUgZW50cmUgNS0xMCUgZGFzIG9ic2VydmHDp8O1ZXMgZGV0ZWN0YWRhcyBuYXMgbWFpb3JlcyBkaXN0w6NuY2lhcy4gVmFtb3Mgc2VsZWNpb25hciBvIHZhbG9yIGRlIGNvcnRlIHBlbG8gbW9kZWxvIGNvbSBtZWxob3IgYWp1c3RlLgoKIyMjIyMjIFRhYmVsYSBjb20gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zCgojIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGNvbSBvcyBkYWRvcyB0cnVuY2Fkb3MuCgojIyMjIyBBanVzdGFuZG8gZGlmZXJlbnRlcyBtb2RlbG9zIHBhcmEgZGFkb3MgR2xvYmFpcwoKXCMqKkFRVUkgQSBHRU5URSBQUkVDSVNBIFRPTUFSIFVNQSBERUNJU8ODTyBJTVBPUlRBTlRFKioKCsOJIG5lY2Vzc8OhcmlvIHRlc3RhciBvcyBxdWF0cm8gZmx1eG9zOiB0b2Rhcy9wb3VjYXMgcmVwZXRpw6fDtWVzIHggZGlzdGFuY2lhcyBleGF0YXMvYWdydXBhZGFzPyBQcmVjaXNvIHZlciBvcyByZXN1bHRhZG9zIGRvcyBmbHV4b3MgYW50ZXJpb3JlcyBwYXJhIHBsYW5lamFyIG1lbGhvciBlc3RhIGV0YXBhLgoKUGFyYSBhIGVzdHJhdGlmaWNhw6fDo28sIHZhbW9zIHRlc3RhciBkaXJldGFtZW50byBvcyBtb2RlbG9zIGNvbSBlIHNlbSBjb3ZhcmnDoXZlaXMuIFZhbW9zIG5vcyBsaW1pdGFyIMOgcyBkaXN0cmlidWnDp8O1ZXMgaGFsZi1ub3JtYWwgZSBoYXphcmQtcmF0ZSwgcG9pcyBzw6NvIGFzIMO6bmljYXMgcXVlIGNvbXBvcnRhbSBvIHVzbyBkYXMgY292YXJpw6F2ZWlzLgoKIyMjIyMjIEhhbGYtbm9ybWFsIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIChITikKCiMjIyMjIyBITiArIFRhbWFuaG8gZG8gZ3J1cG8gKEhOICsgUykKCiMjIyMjIyBITiArIE1pbnV0b3MgYXDDs3MgbyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0gKEhOICsgTSkKCiMjIyMjIyBITiArIFRhbWFuaG8gZG8gZ3J1cG8gKyBNaW51dG9zIGFww7NzIGluw61jaW8gZGEgYW1vc3RyYWdlbSAoSE4gKyBTICsgTSkKCiMjIyMjIyBIYXphcmQtcmF0ZSBzZW0gdGVybW9zIGRlIGFqdXN0ZSAoSFopCgojIyMjIyMgSFogKyBUYW1hbmhvIGRvIGdydXBvIChIWiArIFMpCgojIyMjIyMgSFogKyBNaW51dG9zIGFww7NzIG8gaW7DrWNpbyBkYSBhbW9zdHJhZ2VtIChIWiArIE0pCgojIyMjIyMgSFogKyBUYW1hbmhvIGRvIGdydXBvICsgTWludXRvcyBhcMOzcyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0gKEhaICsgUyArIE0pCgojIyMjIyBDb21wYXJhbmRvIG9zIG1vZGVsb3MKCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zCgojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMKCiMjIyMjIEF2YWxpYW5kbyBhcyBlc3RpbWF0aXZhcyBkZSBBYnVuZMOibmNpYSBlIERlbnNpZGFkZQoKUGFyYSBtb2RlbG9zIGNvbSBjb3ZhcmnDoXZlaXMgYXMgZXN0aW1hdGl2YXMgZGUgYWJ1bmTDom5jaWEgZSBkZW5zaWRhZGUgZGV2ZW0gc2VyIGZlaXRhcyBwb3IgYm9vdHN0cmFwCgojIyMjIyBBanVzdGFuZG8gZGlmZXJlbnRlcyBtb2RlbG9zIHBhcmEgb3MgZGFkb3MgRXN0cmF0aWZpY2Fkb3MKCkEgcmVkdcOnw6NvIG5vIHRhbWFuaG8gYW1vc3RyYWwgZ2VyYWxtZW50ZSBmYXogY29tIHF1ZSBvcyBtb2RlbG9zIHBhcmEgb3MgZGFkb3MgZ2xvYmFpcyB0ZW5oYW0gdW0gYWp1c3RlIG1lbGhvciBxdWUgb3MgbW9kZWxvcyBhanVzdGFkb3MgYW9zIGVzdHJhdG9zLiBVbSBjcml0w6lyaW8gcGFyYSBhdmFsaWFyIGVzdGUgYWp1c3RlIMOpIGNvbXBhcmFyIG8gc29tYXTDs3JpbyBkb3MgdmFsb3JlcyBkZSBBSUMgcGFyYSBjYWRhIGVzdHJhdG8gY29tIG8gdmFsb3IgZGUgQUlDIGRvIG1vZGVsbyBnbG9iYWwuIFNlIGEgc29tYSBkb3MgdmFsb3JlcyBkZSBBSUMgZG9zIGVzdHJhdG9zIGZvciBtZW5vciBxdWUgbyBBSUMgZ2xvYmFsLCBzaWduaWZpY2EgcXVlIG8gYWp1c3RlIGZvaSBtZWxob3IgcGFyYSBvcyBkYWRvcyBlc3RyYXRpZmljYWRvcy4KClwjKipBUVVJIFRBTULDiU0gUFJFQ0lTQSBUT01BUiBVTUEgREVDSVPDg08gSU1QT1JUQU5URSoqCgpSb2RhbW9zIHRvZG9zIG9zIG1vZGVsb3MgcGFyYSBvcyBkYWRvcyBlc3RyYXRpZmljYWRvcz8gT3UgcGFydGltb3MgZG8gbWVsaG9yIG1vZGVsbyBwYXJhIGRhZG9zIGdsb2JhaXM/CgojIyMjIyMgSGFsZi1ub3JtYWwgc2VtIHRlcm1vcyBkZSBhanVzdGUgKEhOKQoKIyMjIyMjIEhOICsgVGFtYW5obyBkbyBncnVwbyAoSE4gKyBTKQoKIyMjIyMjIEhOICsgTWludXRvcyBhcMOzcyBvIGluw61jaW8gZGEgYW1vc3RyYWdlbSAoSE4gKyBNKQoKIyMjIyMjIEhOICsgVGFtYW5obyBkbyBncnVwbyArIE1pbnV0b3MgYXDDs3MgaW7DrWNpbyBkYSBhbW9zdHJhZ2VtIChITiArIFMgKyBNKQoKIyMjIyMjIEhhemFyZC1yYXRlIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIChIWikKCiMjIyMjIyBIWiArIFRhbWFuaG8gZG8gZ3J1cG8gKEhaICsgUykKCiMjIyMjIyBIWiArIE1pbnV0b3MgYXDDs3MgbyBpbsOtY2lvIGRhIGFtb3N0cmFnZW0gKEhaICsgTSkKCiMjIyMjIyBIWiArIFRhbWFuaG8gZG8gZ3J1cG8gKyBNaW51dG9zIGFww7NzIGluw61jaW8gZGEgYW1vc3RyYWdlbSAoSFogKyBTICsgTSkKCiMjIyMjIENvbXBhcmFuZG8gb3MgbW9kZWxvcwoKIyMjIyMjIFRhYmVsYSBjb20gbyByZXN1bW8gY29tcGFyYXRpdm8gZG9zIG1vZGVsb3MKCk9saGFyIHRhbWLDqW0gdmFsb3JlcyBicnV0b3MgZGUgQUlDIGRvcyBtb2RlbG9zIGdsb2JhaXMgZSBjb21wYXJhciBjb20gb3MgZXN0cmF0aWZpY2Fkb3MuCgojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvCgojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMKCiMjIyMjIEF2YWxpYW5kbyBhcyBlc3RpbWF0aXZhcyBkZSBBYnVuZMOibmNpYSBlIERlbnNpZGFkZQoKUGFyYSBtb2RlbG9zIGNvbSBjb3ZhcmnDoXZlaXMgYXMgZXN0aW1hdGl2YXMgZGUgYWJ1bmTDom5jaWEgZSBkZW5zaWRhZGUgZGV2ZW0gc2VyIGZlaXRhcyBwb3IgYm9vdHN0cmFwCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CnBsb3QoY2FycykKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K